type typeUser = {
  id: number
  name: string
}
const users: typeUser[] = [
  { id: 101, name: 'Henry' },
  { id: 102, name: 'Tom' }
]

// 普通函数的重载签名写法
function queryUser(param: number): typeUser | string // 重载签名: 传入number就查询单条信息，成功返回信息，失败返回 string
function queryUser(param: typeUser): boolean // 重载签名: 传入一个对象就是添加，返回布尔值
function queryUser(param: string): typeUser | string // 重载签名: 传入string就查询单条信息，成功返回信息，失败返回 string

// 实现签名
function queryUser(param: unknown): unknown {
  if (typeof param === 'number') {
    return users.filter(user => user.id === param)[0] || 'User not found'
  } else if (typeof param === 'string') {
    return users.filter(user => user.name === param)[0] || 'User not found'
  } else if (typeof param === 'object') {
    return users.push(param as typeUser) ? true : false
  } else {
    return 'Invalid query type'
  }
}

console.log(queryUser(101))
console.log(queryUser(110))
console.log(queryUser('Tom'))
console.log(queryUser({ id: 202, name: 'Elisy' }))
// console.log(queryUser(null)) // 错误，编译不通过，没有与此调用匹配的重载
// console.log(queryUser(true)) // 错误，编译不通过，没有与此调用匹配的重载
console.log(users)

export {}
